| Skala | Aussage | Transformation | Zentrale Lage | Dispersion |
|---|---|---|---|---|
| Nominal | Äquivalenz | eineindeutig | Modus | Relativer Informationsgehalt |
| Ordinal | Ordnung | monoton | Median | Interquartilsbereich |
| Intervall | Verhältnis von Differenzen | positiv linear | Mittelwert | Standardabweichung, Varianz |
| Verhältnis | Verhältnisse | Ähnlichkeit | … | … |
| Absolut | absoluter Wert | Identität | … | … |
load('fb19.rda') # Daten laden
names(fb19) # Namen der Variablen
## [1] "mdbf1" "mdbf2" "mdbf3" "mdbf4" "mdbf5"
## [6] "mdbf6" "mdbf7" "mdbf8" "mdbf9" "mdbf10"
## [11] "mdbf11" "mdbf12" "lz" "extra" "vertr"
## [16] "gewis" "neuro" "intel" "pro" "grund"
## [21] "fach" "ziel" "ziel_sonst" "lerntyp" "geschl"
## [26] "job" "ort" "ort12" "wohnen" "uni1"
## [31] "uni2" "uni3" "uni4"
dim(fb19) # Anzahl Zeile und Spalten
## [1] 118 33
Der Datensatz hat also 118 Beobachtungen auf 33 Variablen.
Typische Beispiele für nominalskalierte Variablen in der Psychologie sind das Geschlecht (z.B. Variable “geschl” in erstis), die Experimentalbedingung (z.B. “UV” und “AV”), die Gruppenzugehörigkeit, … Nominalskalierte Variablen sollten in R als Faktoren hinterlegt werden. Faktoren in R sind Vektoren mit einer vorab definierten Menge an vorgegebenen möglichen Ausprägungen. Sowohl numerische als auch character-Variablen können als Faktor kodiert werden, was mit jeweiligen Vorteilen einhergeht:
Jeder numerischen Faktorstufe (level) kann ein Label zugewiesen werden. Faktorstufe und –label bestehen auch dann, wenn die entsprechende Ausprägung empirisch nicht auftritt.
Beispiel 1: Die (numerische) Variable geschl als Faktor aufbereiten
str(fb19$geschl)
## int [1:118] 1 1 1 2 NA 1 1 1 1 1 ...
fb19$geschl
## [1] 1 1 1 2 NA 1 1 1 1 1 1 1 1 2 1 1 2 1 1 2 1 1 2 1 2
## [26] 1 2 1 1 1 1 1 1 1 1 2 1 2 2 1 1 1 2 2 1 1 2 2 1 1
## [51] 1 1 2 1 1 1 2 2 1 1 1 1 1 1 NA 2 2 1 1 1 1 2 2 2 1
## [76] 1 1 1 2 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 2
## [101] 1 2 NA 1 1 1 1 1 1 1 2 1 1 1 2 2 1 1
Die Variable geschl liegt numerisch vor, es treten die Werte 1 und 2 empirisch auf. Anhand des Kodierschemas (Datei Variablenübersicht.docx) kann den Zahlen eine inhaltliche Bedeutung zugewiesen werden. Beispielsweise bedeutet der Wert 1 “weiblich”. Diese Label werden nun im Faktor hinterlegt.
Vorgehensweise:
datensatz$neueVariable <- factor(...)factor( Ausgangsvariable , levels = Stufen , labels = Label )levels, also der numerischen Ausprägungen auf der Ursprungsvariable (hier: 1, 2, und 3)labels, also die Label für die in levels hinterlegten numerischen Stufen (hier: “weiblich”, “männlich”, “anderes”; unbedingt auf gleiche Reihenfolge achten!)fb19$geschl_faktor <- factor(fb19$geschl, # Ausgangsvariable
levels = 1:3, # Faktorstufen
labels = c("weiblich", "männlich", "anderes")) # Label für Faktorstufen
str(fb19$geschl_faktor)
## Factor w/ 3 levels "weiblich","männlich",..: 1 1 1 2 NA 1 1 1 1 1 ...
head(fb19$geschl_faktor)
## [1] weiblich weiblich weiblich männlich <NA> weiblich
## Levels: weiblich männlich anderes
Beispiel 2: Lieblingsfach (numerisch) als Faktor aufbereiten
Analog dazu wird nachfolgend die ebenfalls numerische Variable fach in einen Faktor umgewandelt. Sie wurde wie folgt erhoben:
fb19$fach
## [1] 1 4 3 4 4 4 2 5 3 1 4 2 3 4 4 1 1 2 2 2 1 1 4 3 1
## [26] 2 1 1 3 1 3 NA 4 2 2 4 3 4 1 2 5 2 4 3 1 2 1 2 4 4
## [51] 4 2 1 4 4 1 4 5 4 2 1 4 4 3 NA 1 4 1 3 4 3 3 3 1 4
## [76] 3 2 4 2 1 2 3 5 4 1 4 1 4 2 1 4 3 3 5 4 3 4 4 3 3
## [101] 4 1 NA 1 1 4 4 1 2 4 4 1 1 4 2 1 2 4
Es treten die Ausprägungen 1 bis 5 empirisch auf. Auch hier werden die Label aus dem Kodierschema zugewiesen.
fb19$fach <- factor(fb19$fach,
levels = 1:5,
labels = c('Allgemeine', 'Biologische', 'Entwicklung', 'Klinische', 'Diag./Meth.'))
str(fb19$fach)
## Factor w/ 5 levels "Allgemeine","Biologische",..: 1 4 3 4 4 4 2 5 3 1 ...
Hinweis: In Beispiel 2 wurde die Ursprungsvariable mit dem Faktor überschrieben. Sie ist nun verschwunden, der Datensatz enthält nur noch den Faktor, nicht mehr die numerische Variable.
Beispiel 3: Einen character-Vektor als Faktor aufbereiten
Um einen character-Vektor in einen Faktor umzukodieren, kann die Funktion as.factor() verwendet werden (siehe Skript zur Lehreinheit 1). Die Ausprägungen werden dann automatisch als Labels übernommen. Die Stufen (levels) werden in alphabetischer Reihenfolge vergeben.
Nachfolgend wird zur Illustration die offenene Freitextantwort zum Grund für das Psychologiestudium (Variable grund) in einen Faktor umgewandelt. Dies ist nicht sinnvoll, da jede einzelne Freitextantwort vermutlich nur genau einmal vorkommt und später sowieso nicht (ohne zusätzliche Kodierung) in statistischen Analysen weiterverwendet werden kann.
str(fb19$grund) # Ursprungsvariable: Character
## chr [1:118] "Ich hatte keine Ahnung, was ich machen soll und es klang ziemlich interessant. Dachte mir dann, warum nicht?" ...
fb19$grund_faktor <- as.factor(fb19$grund) # Umwandlung in Faktor
str(fb19$grund_faktor) # neue Variable: Faktor
## Factor w/ 93 levels "","- Arbeitsfelder, die sich mit dem Menschen befassen, sind interessant für mich\n- ich bin ein empathischer Mens"| __truncated__,..: 35 93 92 53 87 84 16 1 86 54 ...
Hinweise zu den Levels und Labels
Die Reihenfolge von Levels und Labels ergibt sich während der Faktorerstellung:
Die Labels eines Faktors können mit der Funktion levels() abgerufen werden. Die Reihenfolge kann mithilfe der relevel()-Funktion geändert werden. Dafür muss dasjenige Label angesprochen werden, das die erste Position einnehmen soll (hier: ‘Diag./Meth.’).
levels(fb19$fach) # Abruf
## [1] "Allgemeine" "Biologische" "Entwicklung" "Klinische" "Diag./Meth."
fb19$fach <- relevel(
fb19$fach, # Bezugskategorie wechseln
'Diag./Meth.') # Neue Bezugskategorie
Eine deskriptivstatistische Möglichkeit zur Darstellung diskreter (zählbarer) nominalskalierter Variablen sind Häufigkeitstabellen. Diese können in R mit der Funktion table() angefordert werden.
Absolute Häufigkeiten
table(fb19$fach)
##
## Diag./Meth. Allgemeine Biologische Entwicklung Klinische
## 5 30 21 20 39
Häufig sind relative Häufigkeiten informativer. Nachfolgend werden zwei Möglichkeiten zur Erstellung von relativen Häufigkeitstabellen in R gezeigt.
Relative Häufigkeiten (manuell)
Relative Häufigkeiten können aus absoluten Häufigkeiten abgeleitet werden: \(h_j = \frac{n_j}{n}\).
Diese einfache Rechenvorschrift (Kategorienhäufigkeit geteilt durch Gesamthäufigkeit) kann auf das gesamte Tabellenobjekt angewendet werden. So wird jede einzelne absolute Kategorienhäufigkeit am Gesamtwert relativiert, es resultiert eine Tabelle der relativen Häufigkeiten.
tab <- table(fb19$fach) # Absolute Haeufigkeiten
sum(tab) # Gesamtzahl
## [1] 115
tab / sum(tab) # Relative Haeufigkeiten
##
## Diag./Meth. Allgemeine Biologische Entwicklung Klinische
## 0.04347826 0.26086957 0.18260870 0.17391304 0.33913043
Relative Häufigkeiten (per Funktion)
Alternativ kann die Funktion prop.table() auf das Tabellenobjekt mit den absoluten Häufigkeiten angewendet werden.
tab <- table(fb19$fach) # Absolute
prop.table(tab) # Relative
##
## Diag./Meth. Allgemeine Biologische Entwicklung Klinische
## 0.04347826 0.26086957 0.18260870 0.17391304 0.33913043
Nicht einmal 5% Ihres Jahrgangs geben als Lieblingsfach “Diagnostik/Methoden” an! Vielleicht können wir Sie mit dem nächsten Thema begeistern. :-)
RDie Darstellung als Tabelle wirkt häufig langweilig. Zu viele Tabellen in einem Bericht / einer Arbeit schrecken Leser meist ab. Nachfolgend werden grafische Darstellungsformen für diskrete nominalskalierte Variablen gezeigt.
Säulen- oder Balkendiagramm
barplot(tab)
Die Grafik erscheint in der RStudio-Standardansicht “unten rechts” im Reiter “Plots”:
Kuchendiagramm
pie(tab)
Zusatzargumente für Plots
Die Funktionen zur Erstellung sehr einfacher Grafiken sind also denkbar einfach - die Grafiken selbst aber zunächst nicht unbedingt hübsch. R bietet diverse Zusatzargumente zur Anpassung der Optik von Grafiken.
| Argument | Bedeutung |
|---|---|
| main | Überschrift |
| las | Schriftausrichtung (0, 1, 2, 3) |
| col | Farbenvektor |
| horiz | Horizontale Balkenausrichtung (TRUE/FALSE) |
| legend.text | Beschriftung in der Legende |
| xlim, ylim | Beschränkung der Achsen |
| xlab, ylab | Beschriftung der Achsen |
Farben in R
R kennt eine ganze Reihe vordefinierter Farben (\(N = 657\)) mit teilweise sehr poetischen Namen. Diese können mit der Funktion colors() (ohne Argument) abgerufen werden. Hier sind die ersten 20 Treffer:
colors()[1:20]
## [1] "white" "aliceblue" "antiquewhite" "antiquewhite1"
## [5] "antiquewhite2" "antiquewhite3" "antiquewhite4" "aquamarine"
## [9] "aquamarine1" "aquamarine2" "aquamarine3" "aquamarine4"
## [13] "azure" "azure1" "azure2" "azure3"
## [17] "azure4" "beige" "bisque" "bisque1"
Die Farben aus der Liste können als Zahl (Index) oder per Name angesprochen werden. Eine vollständige Liste der Farben findet sich zum Beispiel unter http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf. Farben können aber auch per RGB-Vektor (Funktion rgb()) oder HEX-Wert angesprochen werden.
Zusätzlich können Farbpaletten verwendet werden. Sie bestehen aus einem Farbverlauf, aus dem einzelne Farben “herausgezogen” werden, wodurch ein zusammengehöriges Farbthema in einer Abbildung entsteht. R liefert einige dieser Paletten: rainbow(...), heat.colors(...), topo.colors(...), … Die Farbpalette wird ebenfalls per col-Argugment spezifiziert. Technisch handelt es sich um eine Funktion, für die als Argument die Anzahl der Farben spezifiziert werden muss, die aus der Palette “gezogen” werden sollen. Beispielsweise werden mit col = rainbow(5) fünf Farben aus der rainbow-Palette gezogen.
Beispiel für angepasste Abbildung
barplot(tab,
col = rainbow(20),
xlab = 'Studierende (Anzahl)',
main = 'Lieblingsfach im 1. Semester',
las=1)
Grafiken speichern
Es gibt zwei Möglichkeiten, um in R erzeugte Grafiken als Bilddatei zu speichern: manuell und per Funktion.
Möglichkeit 1: Manuelles Speichern
Klicken Sie auf die Schaltfläche “Export” und dann auf “Save as Image”…
…und spezifizieren Sie dann Dateiname (ggf. Pfad) und Größe/Größenverhältnis.
Wenn kein Pfad spezifiziert wird, erscheint die Datei in Ihrem aktuellen Arbeitsverzeichnis.
Möglichkeit 2: Speichern mit der Funktion jpeg("Dateiname.jpg")
Die Grafikerstellung folgt auf die jpeg()-Funktion und wird mit der Funktion dev.off() abgeschlossen.
jpeg("Mein-Boxplot.jpg", width=15, height=10, units="cm", res=150)
barplot(tab,
col = rainbow(20),
xlab = 'Studierende (Anzahl)',
main = 'Lieblingsfach im 1. Semester',
las=1)
dev.off()
Auch hier gilt: Wenn kein Pfad spezifiziert wurde, liegt die Datei in Ihrem Arbeitsverzeichnis. In der Funktion jpeg() kann mit den Argumenten width, height, units und res Größe, Größenverhältnis und Auflösung gesteuert werden.
Modus
Der Modus (Mo) ist ein Maß der zentralen Tendenz, das die häufigste Ausprägung einer Variablen anzeigt. Die Häufigkeiten sind ja schon in der Häufigkeitstabelle enthalten. Man könnte den Modus also einfach ablesen. Das gleiche lässt sich allerdings auch anhand von Funktionen tun:
tab # Tabelle ausgeben
##
## Diag./Meth. Allgemeine Biologische Entwicklung Klinische
## 5 30 21 20 39
max(tab) # Größte Häufigkeit
## [1] 39
which.max(tab) # Modus
## Klinische
## 5
Der Modus der Variable fach lautet also Klinische, die Ausprägung trat 39 mal auf.
Relativer Informationsgehalt
Der relative Informationsgehalt ist ein Dispersionsmaß, das schon auf Nominalskalenniveau funktioniert. Dafür gibt es in R allerdings keine Funktion! Aus Lehreinheit 1 wissen Sie jedoch, dass R als Taschenrechner genutzt werden kann, folglich können beliebig komplexe Gleichungen in R umgesetzt werden. Die Formel zur Berechnung des relativen Informationsgehalts \(H\) lautet:
\[H = -\frac{1}{\ln(k)} \sum_{j=1}^k{h_j * \ln h_j} \]
\(n_j\) bezeichnet alle gültigen Antworten und kann als Summe der Häufigkeiten in tab abgelesen werden.
hj <- prop.table(tab) # hj erstellen
ln_hj <- log(hj) # Logarithmus bestimmen
ln_hj # Ergebnisse für jede Kategorie
##
## Diag./Meth. Allgemeine Biologische Entwicklung Klinische
## -3.135494 -1.343735 -1.700410 -1.749200 -1.081370
summand <- ln_hj * hj # Berechnung für jede Kategorie
summe <- sum(summand) # Gesamtsumme
relinf <- -1/log(5) * summe # Relativer Informationsgehalt
relinf
## [1] 0.9123118
Eine alternative Schreibweise, die ohne Zwischenschritte auskommt, dafür aber stark verschachtelt ist, lautet:
- 1/log(5) * sum(prop.table(table(fb19$fach)) * log(prop.table(table(fb19$fach))))
## [1] 0.9123118
Der relative Informationsgehalt der Variable fach beträgt demnach 0.912.
In diesem Abschnitt lernen Sie deskriptivstatistische Kennwerte für ordinalskalierte Variablen kennen. Aus der Vorlesung wissen Sie schon, dass Median und Interquartilsabstand (IQB) nur für die Klasse der geordneten Kategorien (auch “Rangklassen”) sinnvoll sind, nicht für singuläre Daten (“Rangwerte”).
Zunächst aber eine Wiederholung: Wie Sie aus der Vorlesung wissen, könnnen die in der Tabelle am Anfang dieses Dokuments aufgeführten statistischen Kennwerte (Zentrale Lage, Dispersion) auch für Skalenniveaus genutzt werden, die “weiter unten” in der Tabelle stehen. Für ordinalskalierte Variablen (Rangklassen) kann also auch der Modus berechnet werden.
Nachfolgend soll mit Item 4 des mdbf gearbeitet werden. Es wurde wie folgt erhoben:
Es treten die Werte 1 bis 4 empirisch auf, außerdem gibt es einen fehlenden Wert (dargestellt als NA):
fb19$mdbf4
## [1] 1 3 1 2 4 2 3 1 1 1 3 1 2 2 2 3 1 3 2 3 1 2 2 2 1
## [26] 1 1 1 1 4 1 3 2 1 2 1 1 1 2 2 1 2 2 1 1 2 1 2 1 1
## [51] 2 1 3 1 4 2 4 2 1 2 2 1 1 1 2 3 3 2 1 1 3 2 2 1 2
## [76] 1 1 NA 1 1 2 4 2 3 1 2 1 3 1 1 3 1 3 2 1 1 1 1 1 2
## [101] 1 4 1 1 3 3 2 4 3 3 3 1 1 1 1 1 2 1
Wiederholung:
table(fb19$mdbf4) # Absolute Haeufigkeiten
##
## 1 2 3 4
## 56 34 20 7
prop.table(table(fb19$mdbf4)) # Relative Haeufigkeiten
##
## 1 2 3 4
## 0.47863248 0.29059829 0.17094017 0.05982906
which.max(table(fb19$mdbf4)) # Modus
## 1
## 1
Fehlende Werte
Fehlende Werte in empirischen Untersuchungen können aus vielen Gründen auftreten:
Für statistische Analysen sind fehlende Werte ein Problem, weil sie außerhalb der zulässigen Antworten liegen.
Fehlende Werte in R
Fehlende Werte werden im Datensatz als NA dargestellt. In R kann man solche Fälle auf zwei unterschiedlichen Ebenen berücksichtigen:
na.omit(datensatz)
na.rm = TRUE
na.rm ist in vielen Funktionen für univariate Statistiken enthaltenNA als Ergebnis produziert, wenn fehlende Werte vorliegenMedian für ordinalskalierte Variablen
median(fb19$mdbf4) # Ohne Argument für NA: funktioniert nicht
## [1] NA
median(fb19$mdbf4, na.rm = TRUE) # Expliziter Ausschluss: funktioniert
## [1] 2
Der Median für die Variable mdbf4 beträgt also 2.
Quantile und IQB
Für eine Beschreibung der Dispersion wird häufig der Interquartilsbereich (IQB) genutzt. IQB ist der Bereich zwischen dem 1. und dem 3. Quartil. Auch dafür gibt es keine Funktion in R, das Dispersionsmaß kann aber einfach “per Hand” selbst berechnet werden:
\[IQB = Q_3 - Q_1\]
Um die Quartile oder jedes beliebige andere Quantil einer Verteilung zu erhalten, kann die Funktion quantile() verwendet werden:
quantile(fb19$mdbf4,
c(.25, .5, .75), # Quartile anfordern
na.rm = T)
## 25% 50% 75%
## 1 2 2
Zur Berechnung des IQB wird nun die Differenz aus drittem und ersten Quartil gebildet:
quantile(fb19$mdbf4, .75, na.rm=T) - quantile(fb19$mdbf4, .25, na.rm=T)
## 75%
## 1
Der IQB der Variable mdbf4 beträgt 1.
Eine geeignete grafische Darstellungsform für (mindestens) ordinalskalierte Daten ist der Boxplot. Er kann über die Funktion boxplot() angefordert werden:
boxplot(fb19$mdbf4)
Zur Erinnerung:
Q3 + 1.5*IQB für das Maximum bzw. Q1 - 1.5*IQB für das MinimumIn diesem Beispiel betragen Median und Q3 jeweils 2, sodass sich die entsprechenden Linien überlagern. Ein Beispiel für einen “schöneren” Boxplot (ohne Überlagerung) ist dieses:
boxplot(fb19$mdbf2)
Auch ein Boxplot kann grafisch angepasst werden. Nachfolgend sehen Sie ein Beispiel, in dem möglichst viel verändert wurde, um die verschiedenen Möglichkeiten aufzuzeigen. Nicht alle Veränderungen sind unbedingt sinnvoll.
boxplot(fb19$mdbf2,
horizontal = TRUE,
main = "WS 2019/2020: Item mdbf1",
xlab = "Ausprägung",
las = 1,
width = 2,
notch = TRUE,
border = "red",
col = "pink1")
install.packages("RXKCD")
library("RXKCD")
searchXKCD("significant")
getXKCD(539)
Der Mittelwert pro Person über alle 5 Items ist in der Spalte lz zu finden:
fb19$lz
## [1] 5.60 4.40 3.40 5.40 3.60 4.40 6.00 4.80 4.80 5.20 3.20 6.40 5.20 5.00 4.40
## [16] 5.40 4.00 4.00 4.60 2.40 6.40 3.40 4.80 4.60 7.00 4.20 6.20 5.20 6.20 3.80
## [31] 6.60 5.80 5.80 3.00 2.00 5.60 5.40 3.80 4.20 6.20 4.80 4.00 4.60 7.00 5.40
## [46] 5.20 5.20 4.80 6.40 6.40 4.20 5.80 3.40 6.40 6.00 4.60 4.40 5.60 7.00 5.60
## [61] 3.60 4.60 4.80 6.00 NaN 6.00 6.60 5.20 6.20 4.80 5.00 4.80 5.00 5.60 5.40
## [76] 6.00 6.40 5.40 5.20 4.80 6.00 5.00 5.20 4.20 4.00 6.40 6.80 5.40 5.60 4.80
## [91] 3.40 5.20 3.00 6.40 6.60 5.60 4.60 3.60 4.40 3.20 4.20 1.80 5.80 4.40 4.80
## [106] 2.20 5.40 3.60 3.20 2.80 4.60 3.40 6.20 6.40 4.25 4.80 6.00 4.40
# Minimum & Maximum
range(fb19$lz, na.rm=T)
## [1] 1.8 7.0
# Quartile
quantile(fb19$lz, c(.25, .5, .75), na.rm=T)
## 25% 50% 75%
## 4.2 5.0 5.8
#Box-Whisker Plot
boxplot(fb19$lz)
# Histogramm
hist(fb19$lz)
# Histogramm (20 Kategorien)
hist(fb19$lz,
breaks = 20)
# Histogramm (ungleiche Kategorien)
hist(fb19$lz,
breaks = c(1, 3, 3.3, 3.6, 3.9, 4.5, 5, 7))
Formel: \({x} = \frac{\sum_{m = 1}^n x_m}{n} = \frac{1}{n} \sum_{m = 1}^n x_m\)
# Arithmetisches Mittel
mean(fb19$lz, na.rm = TRUE)
## [1] 4.942308
Formel: \(s^2_{X} = \frac{\sum_{m=1}^n (x_m - \bar{x})^2}{n}\)
# Händische Varianzberechnung
sum((fb19$lz - mean(fb19$lz, na.rm = TRUE))^2, na.rm = TRUE) / (nrow(fb19)-1)
## [1] 1.306778
Achtung! Wir benötigen für die Varianzberechnung n (s. Formel)! Wir nutzen hier nrow(fb19)-1, weil nrow(fb19) nicht das richtige n anzeigt (eine Person hat einen fehlenden Wert, daher die Anzahl an Zeilen minus der eine fehlende Wert = n)
Kleiner Diskurs zu fehlenden Werten:
Um zu prüfen, ob und wie viele fehlende Werte eine Variable hat, lässt sich z. B. folgende Syntax verwenden:
sum(is.na(fb19$lz))
## [1] 1
Um die Länge einer Variablen ohne fehlende Werte (also die Anzahl an Beobachtungen auf einer Variablen) zu bestimmen, lässt sich z. B. folgende Syntax verwenden:
length(na.omit(fb19$lz))
## [1] 117
Zur händischen Varianzberechnung können wir daher auch folgende Syntax verwenden:
# Händische Varianzberechnung
sum((fb19$lz - mean(fb19$lz, na.rm = TRUE))^2, na.rm = TRUE) / (length(na.omit(fb19$lz)))
## [1] 1.306778
Folgendes Ergebnis liefert R, wenn wir die R-Funktion var() zur Berechnung der Varianz verwenden:
# R-interne Varianzberechnung
var(fb19$lz, na.rm = TRUE)
## [1] 1.318044
Warum erhalten wir hier einen abweichenden Wert im Vergleich zu unserer händischen Varianzberechnung?
Die meisten Programme berechnen nicht die empirische Varianz, sondern einen Schätzer der Populationsvarianz:
Empirische Varianz
\(s^2_{X} = \frac{\sum_{m=1}^n (x_m - \bar{x})^2}{n}\)
Schätzer der Populationsvarianz
\(\hat{\sigma}^2_{X} = \frac{\sum_{m=1}^n (x_m - \bar{x})^2}{n - 1}\)
Um in R die empirische Varianz mithilfe der var()-Funktion zu berechnen, kann man die Populationsvarianz nutzen. Multipliziert man sie mit \(\frac{n - 1}{n}\) erhält man die empirische Varianz.
# Umrechnung der Varianzen
var(fb19$lz, na.rm = TRUE) * (nrow(fb19) - 1) / nrow(fb19)
## [1] 1.306874
Achtung! Dies funktioniert in unserem Fall wieder nicht, da die Verwendung von nrow(fb19) - wie oben bereits angemerkt - nicht sinnvoll ist: nrow(fb19) ist nicht gleich n (eine Person hat einen fehlenden Wert), daher besser:
# Umrechnung der Varianzen
var(fb19$lz, na.rm = TRUE) * (length(na.omit(fb19$lz)) - 1) / (length(na.omit(fb19$lz)))
## [1] 1.306778
Alternativ:
# Umrechnung der Varianzen
var(fb19$lz, na.rm = TRUE) * (117 - 1) / 117
## [1] 1.306778
Auch bei der Standardabweichung bestimmt R den Populationsschätzer \(\hat{\sigma}_{X}\)
# Standardabweichung in R
sd(fb19$lz, na.rm = TRUE) # Populationsschaetzer
## [1] 1.148061
# Händische Berechnung der empirischen Standardabweichung
sqrt(sum((fb19$lz - mean(fb19$lz, na.rm = TRUE))^2,
na.rm = TRUE) / (length(na.omit(fb19$lz))))
## [1] 1.143144
Die Variablenzentrierung und -standardisierung lässt sich in R per Hand berechnen…
# Zentrierung
lz_c <- fb19$lz - mean(fb19$lz, na.rm = TRUE)
head(lz_c)
## [1] 0.6576923 -0.5423077 -1.5423077 0.4576923 -1.3423077 -0.5423077
# Standardisierung
lz_z <- lz_c / sd(fb19$lz, na.rm = TRUE)
head(lz_z)
## [1] 0.5728723 -0.4723684 -1.3434024 0.3986655 -1.1691956 -0.4723684
…oder mit Hilfe bereits existierender Funktionen:
## Befehl zum Standardisieren
lz_z <- scale(fb19$lz)
## Befehl zum Zentrieren (ohne Standardisierung)
lz_c <- scale(fb19$lz,
scale = FALSE) # unterbindet Standardisierung
Viele Fragebögen enthalten sowohl positiv als auch negativ forumulierte Items
Vor der Skalenbildung müssen alle Items in eine Richtung gebracht werden: Rekodierung
Erhebungsinstrument: Mehrdimensionaler Befindlichkeitsfragebogen (MDBF)
Skala gut vs. schlecht:
| Name | Adjektiv | Richtung |
|---|---|---|
| mdbf1 | zufrieden | positiv |
| mdbf4 | schlecht | negativ |
| mdbf8 | gut | positiv |
| mdbf11 | unwohl | negativ |
fb19$mdbf4_r <- -1 * (fb19$mdbf4 - 6)
head(fb19$mdbf4)
## [1] 1 3 1 2 4 2
head(fb19$mdbf4_r)
## [1] 5 3 5 4 2 4
Quizfrage: Ist dies eine zulässige Transformation für ordinalskalierte Variablen (wie Items)?
Antwort: Ja, denn die Ordnungsrelation bleibt hierbei erhalten!
fb19$mdbf11_r[fb19$mdbf11 == 1] <- 5
fb19$mdbf11_r[fb19$mdbf11 == 2] <- 4
fb19$mdbf11_r[fb19$mdbf11 == 3] <- 3
fb19$mdbf11_r[fb19$mdbf11 == 4] <- 2
fb19$mdbf11_r[fb19$mdbf11 == 5] <- 1
head(fb19$mdbf11)
## [1] 1 3 1 4 4 1
head(fb19$mdbf11_r)
## [1] 5 3 5 2 2 5
Skalenwerte werden zumeist als Summen oder Mittelwerte der Items erstellt
# Datensatz der relevanten Variablen
gut_schlecht <- fb19[, c('mdbf1', 'mdbf4_r', 'mdbf8', 'mdbf11_r')]
# Skalenwert in Originaldatensatz erstellen
fb19$gs <- rowMeans(gut_schlecht)
head(fb19$gs)
## [1] 4.50 3.00 4.25 3.00 2.25 4.25
rowMeans() Mittelwert für jede Zeile (über Variablen)colMeans() Mittelwert für jede Spalte (über Personen)rowSums() Summe für jede Zeile (über Variablen)colSums() Summe für jede Spalte (über Personen)